/**
 * @file Trade系统API服务
 * @description 该文件封装了所有与交易、订单、交割、修正相关的API请求。
 */

const API_BASE_URL = '/api'; // 假设API基础路径为 /api

/**
 * 统一处理API请求的函数
 * @param {string} url - 请求的URL
 * @param {object} options - fetch API的配置项, 包括 method, headers, body等
 * @returns {Promise<any>} - 返回Promise，解析为JSON格式的响应数据
 */
async function fetchApi(url, options) {
    try {
        const response = await fetch(url, options);
        if (!response.ok) {
            // 如果HTTP状态码不是2xx，则尝试解析错误信息并抛出
            const errorBody = await response.text();
            let errorMessage = `HTTP error! status: ${response.status}`;
            try {
                // 尝试解析为JSON，后端可能会返回结构化的错误信息
                const errorJson = JSON.parse(errorBody);
                errorMessage = errorJson.message || errorJson.error || JSON.stringify(errorJson);
            } catch (e) {
                // 如果不是JSON，直接使用文本内容
                errorMessage = errorBody || errorMessage;
            }
            throw new Error(errorMessage);
        }
        // 对于204 No Content等情况，body可能为空
        const text = await response.text();
        return text ? JSON.parse(text) : {};
    } catch (error) {
        console.error('API call failed:', error);
        throw error;
    }
}

/**
 * Trade API 服务对象
 */
const tradeService = {

    // =======================================================================
    // 交易订单 (TradeOrder) 相关接口
    // 对应文件: TradeController.java
    // =======================================================================

    /**
     * 创建一个新的交易订单
     * @param {object} createRequest - 创建订单的请求体
     * @param {number} createRequest.userId - 用户ID
     * @param {number} createRequest.accountId - 账户ID
     * @param {number} createRequest.productId - 组合产品ID
     * @param {'BUY' | 'SELL' | 'REBALANCE'} createRequest.type - 交易类型
     * @param {number} createRequest.amount - 交易总金额
     * @param {Array<object>} createRequest.details - 订单详情列表
     * @param {string} createRequest.details[].fundCode - 基金代码
     * @param {number} createRequest.details[].amount - 交易金额
     * @param {'BUY' | 'SELL'} createRequest.details[].direction - 买卖方向
     * @returns {Promise<object>} 创建成功的订单信息
     */
    createTradeOrder(createRequest) {
        return fetchApi(`${API_BASE_URL}/trade/order`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(createRequest),
        });
    },

    /**
     * 批准一个待审核的交易订单
     * @param {number} orderId - 订单ID
     * @param {number} approverId - 审批人ID
     * @returns {Promise<object>} 批准后的订单信息
     */
    approveTradeOrder(orderId, approverId) {
        return fetchApi(`${API_BASE_URL}/trade/order/${orderId}/approve`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ approverId }),
        });
    },

    /**
     * 拒绝一个待审核的交易订单
     * @param {number} orderId - 订单ID
     * @param {number} approverId - 审批人ID
     * @param {string} reason - 拒绝原因
     * @returns {Promise<object>} 拒绝后的订单信息
     */
    rejectTradeOrder(orderId, approverId, reason) {
        return fetchApi(`${API_BASE_URL}/trade/order/${orderId}/reject`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ approverId, reason }),
        });
    },

    /**
     * 获取单个交易订单的详细信息
     * @param {number} orderId - 订单ID
     * @returns {Promise<object>} 订单的详细信息
     */
    getTradeOrderDetails(orderId) {
        return fetchApi(`${API_BASE_URL}/trade/order/${orderId}`, {
            method: 'GET',
        });
    },

    /**
     * 对一个已完成的订单进行交割
     * @param {number} orderId - 订单ID
     * @param {object} settleRequest - 交割请求体
     * @param {Array<object>} settleRequest.details - 交割详情列表
     * @param {number} settleRequest.details[].orderDetailId - 订单明细ID
     * @param {boolean} settleRequest.details[].success - 是否成功
     * @param {number} settleRequest.details[].settledAmount - 成交金额
     * @param {number} settleRequest.details[].settledShares - 成交份额
     * @param {number} settleRequest.details[].fee - 手续费
     * @param {string} [settleRequest.details[].failureReason] - 失败原因 (如果success为false)
     * @returns {Promise<object>} 交割后的订单信息
     */
    settleTradeOrder(orderId, settleRequest) {
        return fetchApi(`${API_BASE_URL}/trade/order/${orderId}/settle`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(settleRequest),
        });
    },

    /**
     * 获取所有失败或部分失败的订单列表
     * @returns {Promise<Array<object>>} 失败订单的列表
     */
    getFailedOrders() {
        return fetchApi(`${API_BASE_URL}/trade/orders/failed`, {
            method: 'GET',
        });
    },


    // =======================================================================
    // 交易修正 (Correction) 相关接口
    // 对应文件: TradeController.java
    // =======================================================================

    /**
     * 对一个失败的订单明细进行修正，会创建一个新的修正订单
     * @param {object} correctionRequest - 修正请求体
     * @param {number} correctionRequest.failedOrderDetailId - 失败的订单明细ID
     * @param {string} correctionRequest.newFundCode - 新的基金代码
     * @param {number} correctionRequest.amount - 新的交易金额
     * @param {string} correctionRequest.reason - 修正原因
     * @param {number} correctionRequest.approverId - 执行修正操作的用户ID
     * @returns {Promise<object>} 创建成功的新修正订单信息
     */
    createCorrection(correctionRequest) {
        return fetchApi(`${API_BASE_URL}/trade/corrections`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(correctionRequest),
        });
    },


    // =======================================================================
    // 交割单 (Settlement) 相关接口
    // 对应文件: SettlementController.java
    // =======================================================================

    /**
     * 根据主订单ID获取其下所有交割单列表
     * @param {number} orderId - 主交易订单ID
     * @returns {Promise<Array<object>>} 交割单列表
     */
    getSettlementsByOrderId(orderId) {
        return fetchApi(`${API_BASE_URL}/settlements?orderId=${orderId}`, {
            method: 'GET',
        });
    },
};

// 示例用法:
/*
// 1. 创建一个订单
const newOrderRequest = {
  userId: 1,
  accountId: 1,
  productId: 1,
  type: 'BUY',
  amount: 5000.00,
  details: [
    { fundCode: 'F001', amount: 3000.00, direction: 'BUY' },
    { fundCode: 'F002', amount: 2000.00, direction: 'BUY' },
  ],
};

tradeService.createTradeOrder(newOrderRequest)
  .then(createdOrder => {
    console.log('订单创建成功:', createdOrder);
    // 2. 批准该订单
    return tradeService.approveTradeOrder(createdOrder.id, 101); // 假设审批员ID是101
  })
  .then(approvedOrder => {
    console.log('订单批准成功:', approvedOrder);
  })
  .catch(error => {
    console.error('操作失败:', error.message);
  });

// 3. 获取失败订单列表
tradeService.getFailedOrders()
  .then(failedOrders => {
    console.log('所有失败的订单:', failedOrders);
  });
*/